From: Ian Campbell Date: Tue, 19 Nov 2013 13:00:15 +0000 (+0000) Subject: xen: arm: implement XEN_DOMCTL_set_address_size X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~5915 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=b862f0b018c36c2d375e2edab5b787115822507c;p=xen.git xen: arm: implement XEN_DOMCTL_set_address_size This is subarch specific to plumb through to arm32 and arm64 versions. The toolstack uses this to select 32- vs 64-bit guests (or rather it does on x86 and soon will for arm too). Signed-off-by: Ian Campbell Acked-by: Julien Grall --- diff --git a/xen/arch/arm/arm32/Makefile b/xen/arch/arm/arm32/Makefile index aacdcb911d..65ecff4f7c 100644 --- a/xen/arch/arm/arm32/Makefile +++ b/xen/arch/arm/arm32/Makefile @@ -7,5 +7,6 @@ obj-y += traps.o obj-y += domain.o obj-y += vfp.o obj-y += smpboot.o +obj-y += domctl.o obj-$(EARLY_PRINTK) += debug.o diff --git a/xen/arch/arm/arm32/domctl.c b/xen/arch/arm/arm32/domctl.c new file mode 100644 index 0000000000..c2ca4d363a --- /dev/null +++ b/xen/arch/arm/arm32/domctl.c @@ -0,0 +1,35 @@ +/****************************************************************************** + * Subarch-specific domctl.c + * + * Copyright (c) 2013, Citrix Systems + */ + +#include +#include +#include +#include +#include +#include +#include + +long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d, + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) +{ + switch ( domctl->cmd ) + { + case XEN_DOMCTL_set_address_size: + return domctl->u.address_size.size == 32 ? 0 : -EINVAL; + default: + return -ENOSYS; + } +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/arm64/Makefile b/xen/arch/arm/arm64/Makefile index 5d28bad752..d2d587584d 100644 --- a/xen/arch/arm/arm64/Makefile +++ b/xen/arch/arm/arm64/Makefile @@ -6,5 +6,6 @@ obj-y += traps.o obj-y += domain.o obj-y += vfp.o obj-y += smpboot.o +obj-y += domctl.o obj-$(EARLY_PRINTK) += debug.o diff --git a/xen/arch/arm/arm64/domctl.c b/xen/arch/arm/arm64/domctl.c new file mode 100644 index 0000000000..e2b4617343 --- /dev/null +++ b/xen/arch/arm/arm64/domctl.c @@ -0,0 +1,59 @@ +/****************************************************************************** + * Subarch-specific domctl.c + * + * Copyright (c) 2013, Citrix Systems + */ + +#include +#include +#include +#include +#include +#include +#include + +static long switch_mode(struct domain *d, enum domain_type type) +{ + if ( d == NULL ) + return -EINVAL; + if ( d->tot_pages != 0 ) + return -EBUSY; + if ( d->arch.type == type ) + return 0; + + d->arch.type = type; + + return 0; +} + +long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d, + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) +{ + switch ( domctl->cmd ) + { + case XEN_DOMCTL_set_address_size: + switch ( domctl->u.address_size.size ) + { + case 32: + return switch_mode(d, DOMAIN_PV32); + case 64: + return switch_mode(d, DOMAIN_PV64); + default: + return -EINVAL; + } + break; + + default: + return -ENOSYS; + } +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c index 4cf02949f9..546e86bdec 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -15,7 +15,11 @@ long arch_do_domctl(struct xen_domctl *domctl, struct domain *d, XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { - return -ENOSYS; + switch ( domctl->cmd ) + { + default: + return subarch_do_domctl(domctl, d, u_domctl); + } } void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c) diff --git a/xen/include/asm-arm/hypercall.h b/xen/include/asm-arm/hypercall.h index 3327a96897..94a92d4ea6 100644 --- a/xen/include/asm-arm/hypercall.h +++ b/xen/include/asm-arm/hypercall.h @@ -6,6 +6,9 @@ int do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg); long do_arm_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg); +long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d, + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl); + #endif /* __ASM_ARM_HYPERCALL_H__ */ /* * Local variables: